Шаг 394 - Что дальше делать с переполнение.

А дальше нужно делать класс. Вот такой например. Основная работа по перегрузки всяких там операторов. Мы перегрузим сложение.

// MathInt.h: interface for the CMathInt class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_)
#define AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CMathInt  
{
public:
	CMathInt(int xx);
	virtual ~CMathInt();
	int operator+(int y);

private:
	int x;

};

#endif // !defined(AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_)

Его реализация

// MathInt.cpp: implementation of the CMathInt class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MathInt.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMathInt::CMathInt(int xx)
{
x=xx;
}

CMathInt::~CMathInt()
{

}

int CMathInt::operator+(int y)
{
	int k=0;			// флаг переполнения
	int z=x;
	_asm
	{
    	pushf				// сохраняем флаги
    	push ecx				// сохраняем регистр который будем использовать
	mov         ecx,dword ptr [z]	// из переменной в регистр
	add         ecx,dword ptr [y]	// складываем
	mov         dword ptr [z],ecx	// результат назад
	jo  overflow					// переход по переполнению
		jmp endover;				// небыло переполнения
	overflow:					// переполнение 
		mov         dword ptr [k],1		// установим флаг
	endover:						
	pop ecx						// востановить регистр
	popf						// востановить флаги
	}

	if (k==1) throw("Overflow "); 
	x=z;
	return  x;
}

А теперь попробуем использовать.

#include "MathInt.h"


void main()
{

CMathInt ci(2147483646);
int i;
i= ci+1;
cout << i << endl;	
}

Сейчас все нормально.

394_1.gif (2407 b)

Прибавим число побольше.

i= ci+4;

Вот, что и требовалось.

394_2.gif (7385 b)

Hosted by uCoz